/**
 * 日期时间格式化工具
 * 基于 dayjs 库实现更丰富的日期处理功能
 */
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn.js'; // 添加.js扩展名
import relativeTime from 'dayjs/plugin/relativeTime.js'; // 添加.js扩展名
import customParseFormat from 'dayjs/plugin/customParseFormat.js'; // 添加.js扩展名
import utc from 'dayjs/plugin/utc.js'; // 添加.js扩展名
import timezone from 'dayjs/plugin/timezone.js'; // 添加.js扩展名

// 配置dayjs
dayjs.locale('zh-cn'); // 设置语言为中文
dayjs.extend(relativeTime);
dayjs.extend(customParseFormat);
dayjs.extend(utc);
dayjs.extend(timezone);

/**
 * 格式化日期时间为标准格式
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @param {string} [format='YYYY-MM-DD HH:mm:ss'] 输出格式
 * @returns {string} 格式化后的日期时间字符串
 */
export function formatDateTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) return null;
  return dayjs(date).format(format);
}

/**
 * 格式化为日期
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {string} 格式化后的日期字符串 YYYY-MM-DD
 */
export function formatDate(date) {
  return formatDateTime(date, 'YYYY-MM-DD');
}

/**
 * 格式化为时间
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {string} 格式化后的时间字符串 HH:mm:ss
 */
export function formatTime(date) {
  return formatDateTime(date, 'HH:mm:ss');
}

/**
 * 获取相对时间（如：3小时前，2天前）
 * @param {Date|string|number} date 日期对象、日期字符串或时间戳
 * @returns {string} 相对时间字符串
 */
export function fromNow(date) {
  if (!date) return null;
  return dayjs(date).fromNow();
}

/**
 * 计算两个日期之间的差异
 * @param {Date|string|number} date1 第一个日期
 * @param {Date|string|number} date2 第二个日期
 * @param {string} unit 单位('second'|'minute'|'hour'|'day'|'month'|'year')
 * @returns {number} 差异值
 */
export function diff(date1, date2, unit = 'day') {
  return dayjs(date1).diff(dayjs(date2), unit);
}

/**
 * 检查日期是否有效
 * @param {Date|string|number} date 要检查的日期
 * @returns {boolean} 是否为有效日期
 */
export function isValid(date) {
  return dayjs(date).isValid();
}

/**
 * 将日期字符串转换为时间戳
 * @param {string} dateString 日期字符串
 * @returns {number} 时间戳
 */
export function toTimestamp(dateString) {
  if (!dateString) return null;
  return dayjs(dateString).valueOf();
}

/**
 * 获取当前日期时间的格式化字符串
 * @param {string} [format='YYYY-MM-DD HH:mm:ss'] 输出格式
 * @returns {string} 当前日期时间的格式化字符串
 */
export function now(format = 'YYYY-MM-DD HH:mm:ss') {
  return dayjs().format(format);
}

export default {
  formatDateTime,
  formatDate,
  formatTime,
  fromNow,
  diff,
  isValid,
  toTimestamp,
  now,
  dayjs // 导出dayjs实例，以便在需要时使用更多功能
}